package co.gov.medellin.ssti.sub.web.action;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.springframework.beans.factory.annotation.Autowired;

import co.gov.medellin.ssti.sub.common.util.Atributo;
import co.gov.medellin.ssti.sub.model.service.ConsultasService;
import co.gov.medellin.ssti.sub.model.vo.AtributoVO;
import co.gov.medellin.ssti.sub.paoyer.administration.model.vo.UserVO;

public class InsertarAtriAdicionalesAction extends Action {
	@Autowired
	ConsultasService consultasServiceImpl;

	/**
	 * This is the main action called from the Struts framework.
	 * 
	 * @param mapping
	 *            The ActionMapping used to select this instance.
	 * @param form
	 *            The optional ActionForm bean for this request.
	 * @param request
	 *            The HTTP Request we are processing.
	 * @param response
	 *            The HTTP Response we are processing.
	 * @return
	 * @throws java.io.IOException
	 * @throws javax.servlet.ServletException
	 */
	@SuppressWarnings("unchecked")
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws IOException, ServletException {

		HttpSession session = request.getSession();
		// Proceso para la auditoria
		UserVO user = (UserVO) session.getAttribute("userInfo");
		String terminalAddress = request.getRemoteAddr();
		String strTerminal = ("WEB=" + terminalAddress);
		Calendar c = Calendar.getInstance();
		SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
		// Fin del proceso

		List<String> lError = new LinkedList<String>();
		Object Error = (Object) session.getAttribute("ListaError");
		if (Error != null) {
			lError = (List<String>) session.getAttribute("ListaError");
		}

		String sub = (String) session.getAttribute("subprograma");

		List lNombre = (List) session.getAttribute("ListaNombre");
		List<String> lConvertirGene = (List<String>) session
				.getAttribute("ListaConvertir");
		List<String> lCamposOblig = (List<String>) session
				.getAttribute("ListaCamposObli");

		Object InsertAtri = (Object) session.getAttribute("ListaAtributos");
		Collection<AtributoVO> coInsertarAtri = new ArrayList<AtributoVO>();
		if (InsertAtri != null) {
			coInsertarAtri = (Collection<AtributoVO>) session
					.getAttribute("ListaAtributos");
		}

		AtributoVO objatri = null;
		for (int i = 1; i < 6; i++) {
			int sw = 0;
			List<Object> lComparacion = new ArrayList<Object>();

			// Proceso para validar los campos obligatorios
			Object obNombre = (Object) request.getParameter("nombre" + i);
			if (!obNombre.equals("")) {
				lComparacion.add(obNombre);
			}
			Object obOrden = (Object) request.getParameter("orden" + i);
			if (!obOrden.equals("")) {
				lComparacion.add(obOrden);
			}
			Object obEtiqueta = (Object) request.getParameter("etiqueta" + i);
			if (!obEtiqueta.equals("")) {
				lComparacion.add(obEtiqueta);
			}
			Object obDescrip = (Object) request.getParameter("descripcion" + i);
			if (!obDescrip.equals("")) {
				lComparacion.add(obDescrip);
			}

			int icomparacion = lComparacion.size();
			if (icomparacion == 0 || icomparacion == 4) {
				String strNombre = request.getParameter("nombre" + i);
				String strOrden = request.getParameter("orden" + i);
				String strEtiqueta = request.getParameter("etiqueta" + i);

				if (!strOrden.equals("") && !strNombre.equals("")) {
					int iOrdenMin = Integer.valueOf(strOrden).intValue();
					if (iOrdenMin > 299) {
						Object obListaAtri = (Object) session
								.getAttribute("ListaAtributos");
						Object obConvertir = (Object) request
								.getParameter("convertir" + i);
						AtributoVO objAtriVO = null;
						// valido que si es la primera vez no entre
						if (obListaAtri != null) {
							List<AtributoVO> lListaAtributos = (List<AtributoVO>) session
									.getAttribute("ListaAtributos");
							int tamanolistaatri = lListaAtributos.size();
							for (int j = 0; j < tamanolistaatri; j++) {
								objAtriVO = (AtributoVO) lListaAtributos.get(j);
								String strnomcom = objAtriVO.getNombre();
								String strordencom = objAtriVO.getOrden();
								// Proceso para validar que el orden y el
								// nombre sean diferentes
								if (strNombre.equals(strnomcom)
										|| strOrden.equals(strordencom)) {
									sw = 1;
									session.setAttribute("Mostrar", "3");
									lError.add(strEtiqueta);
									lError.add(strOrden);
								}
							}
						}
						// fin del proceso

						if (!strNombre.equalsIgnoreCase("") && sw == 0) {
							objatri = new AtributoVO();
							objatri.setTipoatributo(request
									.getParameter("tipo_atributo" + i));
							;
							objatri.setNombre(request
									.getParameter("nombre" + i));
							objatri.setOrden(request.getParameter("orden" + i));
							objatri.setLongitud(request.getParameter("longitud"
									+ i));
							objatri.setObligatorio(request
									.getParameter("obligatorio" + i));
							objatri.setEtiqueta(request.getParameter("etiqueta"
									+ i));
							objatri.setValLista(request
									.getParameter("validar_lista" + i));
							objatri.setDescripcion(request
									.getParameter("descripcion" + i));
							objatri.setTipodato(request
									.getParameter("tipo_dato" + i));

							coInsertarAtri.add(objatri);

							int Orden = consultasServiceImpl.findOrden(
									objatri.getOrden(), sub);
							int Nomb = consultasServiceImpl.findNombre(
									objatri.getNombre(), sub);
							int iLong = 0;

							if (Integer.parseInt(objatri.getLongitud().trim()) > 500) {
								iLong = 1;
							}

							if (Orden == 0 && Nomb == 0 && iLong == 0) {
								if (obConvertir != null) {
									lConvertirGene.add(request
											.getParameter("nombre" + i));
								}
							} else {
								session.setAttribute("Mostrar", "3");
								Object obError = (Object) lError;
								if (obError != null) {
									lError.add(objAtriVO.getEtiqueta());
									lError.add(strOrden);
								}

							}
						}
						// envio la lista donde almaceno los atributos a
						// ingresar
						session.setAttribute("ListaAtributos", coInsertarAtri);
					} else {
						session.setAttribute("Mostrar", "3");
						Object Errores = (Object) lError;
						if (Errores == null) {
							lError = new LinkedList<String>();
						}
						lError.add(strEtiqueta);
						lError.add(strOrden);
					}
				}
			} else {
				session.setAttribute("Mostrar", "3");
				session.setAttribute("TipoError", "2");
				int sw1 = 0;
				if (!(request.getParameter("etiqueta" + i)).equals("")
						&& sw1 == 0) {
					lCamposOblig.add(request.getParameter("etiqueta" + i));
					sw1 = 1;
				}
				if (!(request.getParameter("nombre" + i)).equals("")
						&& sw1 == 0) {
					lCamposOblig.add(request.getParameter("nombre" + i));
					sw1 = 1;
				}
				if (!(request.getParameter("descripcion" + i)).equals("")
						&& sw1 == 0) {
					lCamposOblig.add(request.getParameter("descripcion" + i));
					sw1 = 1;
				}
				if (!(request.getParameter("orden" + i)).equals("") && sw1 == 0) {
					lCamposOblig.add(request.getParameter("orden" + i));
					sw1 = 1;
				}

				session.setAttribute("ListaCamposObli", lCamposOblig);
			}
		}

		if ((Object) coInsertarAtri != null) {
			// Proceso para insertar los atributos del subprograma
			int tamanolist = coInsertarAtri.size();
			if (tamanolist == 0) {
				// System.out.println("no hay atributos que insertar");
			} else {
				if (lError.size() == 0) {
					List<AtributoVO> lLisAtri = (List<AtributoVO>) coInsertarAtri;
					AtributoVO objatributo = null;
					for (int i = 0; i < tamanolist; i++) {
						objatributo = (AtributoVO) lLisAtri.get(i);
						String strNomespe = objatributo.getNombre();
						int continuar = 0;
						if (lError.size() > 0) {
							int t = 0;
							while (t < lError.size()) {
								String nombre1 = (String) lError.get(t);
								t += 2;
								if (strNomespe.equals(nombre1)) {
									continuar = 1;
								}
							}
						}

						if (continuar == 0) {

							String strArr[] = { objatributo.getTipoatributo(),
									objatributo.getNombre().trim(),
									objatributo.getDescripcion().trim(),
									objatributo.getOrden(),
									objatributo.getTipodato(),
									objatributo.getLongitud(),
									objatributo.getObligatorio(),
									objatributo.getEtiqueta().trim(),
									objatributo.getValLista(), user.getName(),
									dateFormat.format(c.getTime()),
									strTerminal, user.getName(),
									dateFormat.format(c.getTime()), strTerminal };
							lNombre.add(objatributo.getNombre());
							int bInsertAtributo = consultasServiceImpl
									.insertAtributo(strArr, sub);
						}
						// Proceso para ingresar los atributos especificos
						// que se convirtieron en generales
						Object obConvertirEspGen = (Object) lConvertirGene;
						if (obConvertirEspGen != null) {
							int tamanocon = lConvertirGene.size();
							for (int k = 0; k < tamanocon; k++) {
								String strNomconvertir = (String) lConvertirGene
										.get(k);
								if (strNomespe.equals(strNomconvertir)) {
									int iOrdenMax = consultasServiceImpl
											.findOrdenAtriGene();
									String strOrdenGene = String
											.valueOf(iOrdenMax);
									String strArrGen[] = {
											objatributo.getTipoatributo(),
											strNomespe.trim(),
											objatributo.getDescripcion().trim(),
											strOrdenGene,
											objatributo.getTipodato(),
											objatributo.getLongitud(),
											objatributo.getObligatorio(),
											objatributo.getEtiqueta().trim(),
											objatributo.getValLista(),
											user.getName(),
											dateFormat.format(c.getTime()),
											strTerminal, user.getName(),
											dateFormat.format(c.getTime()),
											strTerminal };
									int bInsertAtributoGene = consultasServiceImpl
											.insertAtributoGene(strArrGen);
									List<String> lCodsMaxAtri = (List<String>) consultasServiceImpl
											.findCodMaxAtriGene();
									int CodAtriEspMax = Integer.valueOf(
											(String) lCodsMaxAtri.get(0))
											.intValue();
									int CodAtriGenMax = Integer.valueOf(
											(String) lCodsMaxAtri.get(1))
											.intValue();
									int ActualizoBienAtri = consultasServiceImpl
											.actualizarCampoUno(CodAtriEspMax,
													CodAtriGenMax);
								}
							}
						}
						// Fin del proceso
					}
				}
			}
			// Fin del Proceso
		} else {
			// System.out.println("No hay atributos que ingresar");
			// Creo que se debe de eliminar el subprograma
		}

		if (Error != null) {
			int iTamanoError = lError.size();
			if (iTamanoError != 0) {
				session.setAttribute("ListaError", lError);
			}
		}

		session.setAttribute("ListaNombre", lNombre);

		int iTamanoValidar = lNombre.size();
		if (iTamanoValidar != 0) {
			Collection<Atributo> val = consultasServiceImpl
					.findAtriValidarLista(lNombre, sub);
			request.setAttribute("tamano", val.size() + "");
			request.setAttribute("dominios", val);
		}

		return mapping.findForward("success");

	}
}
